<?php
/**
 * 相关产品的操作
 * @author:zhulin
 * @since :2012 5.8
 */
class Product_Info{
    
    const TABLE_NAME = 'product_info';
    const TABLE_NAME_LEVElS = 'product_levels';
    const TABLE_NAME_AGE = 'product_age';
    const TABLE_NAME_SEX = 'product_sex';
    const TABLE_DIMENSION='dimensions';
        /**
     * db实例
     *
     * @var Helper_Cache_Memcache
     */
    protected $_dbInstance;
    
    /**
     * cookie的命名空间
     */
    const COOKIE_NS = 'ProductInfo';

    /**
     * session的命名空间
     */
    const SESSION_NS = 'UserInfo';
    /**
     *单例对象
     */    
   public static $singletonObjects = array();
   
   /**
    * 获取单例对象
    */
   public static function getInstance(){
       $className = __CLASS__;
       if( !isset( self::$singletonObjects[$className] ) )
		{
			self::$singletonObjects[$className] = new self( );
		}
		return self::$singletonObjects[$className];
       
       
   }
   /**
     * 构造器
     *
     * @param int $uId
     */
    protected function __construct() {

        $this->_dbInstance = $this->_getMysql();
    }

    /*
     * 获取db实例
     */

    public function _getMysql() {

        return Common::getMysql();
    }
   /**
    * 获取八条所有产品信息
    * @return array(
    *   <pre>
    *           PId     int    产品ID
    *           PName   string 产品名称
    *           PBrand  int    产品品牌ID
    *           BCat    int    产品大类型ID
    *           SCat    int    产品小类型ID
    *           PicGood string 产品缩略图的路径
    *           PicOriginal string 产品源图片的路径
    *           Prict   double  产品价格
    *   </pre>
    * )
    */
   public function getProductInfo(){
       $productInfo = Common::getMysql()->getList( self::TABLE_NAME , 1 , $order = array() , $start = 0 , $limit = 8);
       return $productInfo;

   }
   /**
    * 获得所有产品信息
    */
   public function getAllProductInfo(){
      $productInfo = Common::getMysql()->getList( self::TABLE_NAME ,1);
      return $productInfo;
       
   }
   
   /**
    * 根据产品大类获取产品信息
    * @param type $TID    产品类型ID
    * @return array(
    * <pre>
    *           PId     int    产品ID          
    *           PName   string 产品名称
    *           PBrand  int    产品品牌ID
    *           BCat    int    产品大类型ID
    *           SCat    int    产品小类型ID
    *           PicGood string 产品缩略图的路径
    *           PicOriginal string 产品源图片的路径
    *           Prict   double  产品价格
    * </pre>
    */
  public function getProductInfoByCat( $TId ){
      $productInfo = Common::getMysql()->getList( self::TABLE_NAME , array( 'BCat'=>$TId ));
      if( empty ( $productInfo)){
         $productInfo = Common::getMysql()->getList( self::TABLE_NAME , array( 'SCat'=>$TId ) );
      }
      return $productInfo;
  }
 /**
  * 根据产品的PId 查询产品的一条详细信息
  * @param type $PId
  * @return type 
  */
  public function getProuctInfoByPId( $PId){
       return  $productInfo = Common::getMysql()->get( self::TABLE_NAME , array( 'PId'=>$PId ) );
  }
  /**
   *根据产品的PId 查询多条产品的信息
   * @param type $PId
   * @return type 
   */
  public function getProuctInfoList( $PId){
       return  $productInfo = Common::getMysql()->getList( self::TABLE_NAME , array( 'PId'=>$PId ) );
  }
  /**
   *根据多个pid 查询多个产品信息
   * @return type 
   */
  public function getProductMultiInfoByPId( $pid ){
       
       return  $productInfo = Common::getMysql()->getMultiList( self::TABLE_NAME , 'PId' , $pid );
  }
  /**
   * 获得产品详细信息
   */
  public function getProductDetail( $PId ){
      $productInfo = Common::getMysql()->get( self::TABLE_NAME , array( 'PId'=>$PId ) );
      return  $productInfo;    
  }
  /**
   * 根据PId 获得多个产品信息
   */
  public function getProductInfoMulti( $arrPId ){
      
      $productInfo = Common::getMysql()->getMultiList( self::TABLE_NAME ,'PId' , $arrPId);
      return $productInfo;
  }
  /**
   * 浏览过的产品记入缓存
   * @param type $productInfo 
   */
 public function saveToCookieSession( $productInfo ){
     /**
      * session 不存在
      */
     $PId= $productInfo['PId'];
     if( empty( $_SESSION[ self::SESSION_NS]) ){
         $arrCache = array(
                    $PId => array(
                    'Count' => 1,
                    'Date' => date(' Y-m-d H:m:s ', time())
                     )
                 
             );
             $arrCache = serialize( $arrCache);
             $_SESSION[ self::SESSION_NS] =  $arrCache;
         /**
          * 存在cookie 则更新cookie
          */
         if( isset( $_COOKIE[ self::COOKIE_NS] )){
               $arrCookie  = unserialize( $_COOKIE[self::COOKIE_NS] );
               $arrSession = unserialize( $_COOKIE[self::SESSION_NS] );
               /**
                * 更新cookie
                */
               if( array_key_exists( $PId , $arrCookie  ) ){
                    $arrCookie [$PId][ 'Count'] = $arrCookie [$PId][ 'Count'] + 1 ;
                    $arrCookie [$PId][ 'Date'] = date( 'Y-m-d H:m:s ', time() ) ;
                    
                    $arrCookie = serialize( $arrCookie ) ;
                    setcookie( self::COOKIE_NS, $arrCookie ,time()+3600 ) ;
               }
               /**
                * 创建cookie
                */
               else{
                    $arrCookie = serialize( $arrSession[$pid ] ) ;
                    setcookie(self::COOKIE_NS, $arrCookie ,time()+36000) ;
               }
         }
         /**
          * 没有cookie 存在的情况， 创建cookie
          */
         else{
             setcookie( self::COOKIE_NS ,$arrCache ,time()+3600 ); 
         }
        
 
     }
     /**
      * session 存在
      */
     else{
         /**
          * 没有cookie ,则创建cookie
          */
         $arrSession = unserialize(  stripslashes( $_SESSION[self::SESSION_NS]) );
         if( isset(  $_COOKIE[self::COOKIE_NS] ) ){
             $arrCookie = unserialize(   stripslashes( $_COOKIE[self::COOKIE_NS]));
         }
         
            /*
             * 有此产品ID存在的session和cookie
             * 更新与此产品ID对应的session和cookie
             */
            if (array_key_exists( $PId , $arrSession)) {
                $arrSession [$PId] ['Count'] = $arrSession [$PId] ['Count'] + 1;
                $arrSession [$PId] ['Date'] = date('Y-m-d H:m:s', time());

                $arrSession = serialize($arrSession);
                $_SESSION [self::SESSION_NS] = $arrSession;
                setcookie(self::COOKIE_NS, $_SESSION [self::SESSION_NS], time() + 3600);
            }
            /*
             * 原session用户查询记录无此产品ID，插入此次查询记录session 和cookie
             */ else {
                $arrSession [$PId] =
                        array(
                            'Count' => 1,
                            'Date' => date(' Y-m-d H:m:s ', time())
                );

                $arrSession = serialize($arrSession);

                $_SESSION [self::SESSION_NS] = $arrSession;

                setcookie(self::COOKIE_NS, $_SESSION [self::SESSION_NS], time() + 3600);
            }
         
     }
 }
    /**
     *　根据cookie 获得产品浏览历史记录
     * @param type $arrCookie 
     */
    public function getProductHistory( $arrCookie){
        
        $arrDate = array();
        foreach( $arrCookie as $key =>$value){
            $arrDate[ $key ] = strtotime( $value['Date'] );
            
        }
        arsort( $arrDate ); 
        $arrSlice = array_slice( $arrDate , 0 ,8, true);
        $arrPId = array_keys( $arrSlice);
        $productHistory = Common::getMysql()->getMultiList(self::TABLE_NAME, 'PId', $arrPId);
        return $productHistory;

        
    }
    /**
     * 根据品牌获得产品的信息
     */
    public function getProductInfoByBrand( $BId ){
          $productInfo = Common::getMysql()->getList( self::TABLE_NAME , array( 'PBrand'=>$BId)  );
         
          return $productInfo;  
      }
   /**
     * 根据产品ID查询一条记录
     * 返回此ID产品数组
     */
    public function getProductInfoByPId ( $pid ) {
        
        $table = self::TABLE_NAME;
        $where = 'PId ='.$pid;
        return $this->_dbInstance ->get($table, $where);
        
    }
    /**
     * 根据消费层次获得产品信息
     */
    public function getProductInfoByLevel( $TId ,$LId ){
        /**
         * 根据产品维度查询产品的PId
         */
        $arrPId = Common::getMysql()->getlist( self::TABLE_NAME_LEVElS , array( 'DId' =>$LId));
        $PId = array();
        foreach( $arrPId as $key =>$value ){
            $PId[]= $value['PId'];
        }
        /*
         * 根据PId查询产品信息
         */
        $productInfo1 = Common::getMysql()->getMultiList( self::TABLE_NAME ,'PId' , $PId );
        /**
         * 产品种类
         */
        $productInfo2 = Common::getMysql()->getlist( self::TABLE_NAME , array( 'BCat'=>$TId ));

        /**
         * 从产品种类中查询产品
         */
        foreach( $productInfo2 as $key=>$value){
          if( in_array( $value , $productInfo1 ) ) {
              $productInfo[]= $value; 
              return $productInfo;
          } 
            
        }
        
    }
    /**
     * 根据性别查询产品
     * 
     */
    public function getProductInfoBySex( $TId , $SId ){
        /**
         * 根据维度查询产品的PId
         */
        $arrPId = Common::getMysql()->getlist( self::TABLE_NAME_SEX , array( 'DId' =>$SId));
        $PId = array();
        foreach( $arrPId as $key =>$value ){
            $PId[]= $value['PId'];
        }
        
         /*
         * 根据PId查询产品信息
         */
        $productInfo1 = Common::getMysql()->getMultiList( self::TABLE_NAME ,'PId' , $PId );
        
        /**
         * 产品种类
         */
        $productInfo2 = Common::getMysql()->getlist( self::TABLE_NAME , array( 'BCat'=>$TId ));
         /**
         * 从产品种类中查询产品
         */
        foreach( $productInfo2 as $key=>$value){
          if( in_array( $value , $productInfo1 ) ) {
              $productInfo[]= $value; 
              return $productInfo;
          }  
            
        }
      
        
    }
        /**
     * 根据年龄查询产品
     * 
     */
    public function getProductInfoByAge( $TId , $AId ){
        /**
         * 根据维度查询产品的PId
         */
        $arrPId = Common::getMysql()->getlist( self::TABLE_NAME_AGE , array( 'DId' =>$AId));
        $PId = array();
        foreach( $arrPId as $key =>$value ){
            $PId[]= $value['PId'];
        }
        
         /*
         * 根据PId查询产品信息
         */
        $productInfo1 = Common::getMysql()->getMultiList( self::TABLE_NAME ,'PId' , $PId );
        
        /**
         * 产品种类
         */
        $productInfo2 = Common::getMysql()->getlist( self::TABLE_NAME , array( 'BCat'=>$TId ));
         /**
         * 从产品种类中查询产品
         */
        foreach( $productInfo2 as $key=>$value){
          if( in_array( $value , $productInfo1 ) ) {
              $productInfo[]= $value; 
               return $productInfo;
          } 
         
        }
       
        
    }
    /**
     * 随机获取产品表中的的数据
     */
    public function getProductInfoRand(){
      $productInfo = Common::getMysql()->getMultiList ( self::TABLE_NAME , 'PId' , array( rand(1 ,10) , rand(1 ,10) , rand(1 ,10) ,  rand(1 ,10) ));
      return $productInfo;
    }
/**
 * 上传图片
 */
    public function imgUpload( $files , $path , $newWidth , $newHeight ){
        $pName = Helper_File::getInstance()->uploadBySize( $files , $path , $newWidth , $newHeight );
        return $pName;
        
    }
    /**
     * 添加产品到数据库
     */
    public function addProductToSql($PName , $BType , $Stype , $Brand , $Price , $PicThumb ,$PicSource ){
        if(empty($PName) || empty( $BType )|| empty( $Stype ) || empty( $Brand ) ||  empty( $Price ) || empty( $PicThumb ) || empty( $PicSource )){
            throw new AppException( 303 );  
        }
        $productInfo = array(
            //'PId'=> Counter_Builder::getInstance()->getUniqueIdByKey( 'uId' ),
            'PName' =>$PName,
            'PBrand' =>$Brand,
            'BCat' =>$BType,
            'SCat' =>$Stype,
            'PicGoods'=>$PicThumb,
            'PicOriginal'=>$PicSource,
            'Price'=>$Price
            
        );
        //print_r($productInfo );
        //添加用户信息到数据库
       $affectedRows = Common::getMysql()->add( self::TABLE_NAME ,$productInfo );;
        if( $affectedRows < 1 )
        {
            throw new AppException( 1000 );
        }
    }
   /**
    *修改产品表
    * 
    */
    public function updateProduct( $pid , $PName, $BType, $Stype, $Brand, $Price, $PicThumb, $PicSource ){
         if(empty($pid) ||empty($PName) || empty( $BType )|| empty( $Stype ) || empty( $Brand ) ||  empty( $Price ) || empty( $PicThumb ) || empty( $PicSource )){
            throw new AppException( 303 );  
        }
        $productInfo = array( 
            'PName' =>$PName,
            'PBrand' =>$Brand,
            'BCat' =>$BType,
            'SCat' =>$Stype,
            'PicGoods'=>$PicThumb,
            'PicOriginal'=>$PicSource,
            'Price'=>$Price
            
        );
        $affectedRows = Common::getMysql()->update( self::TABLE_NAME , array( 'PId' => $pid ) ,$productInfo  );;
        if( $affectedRows < 1 )
        {
            throw new AppException( 1000 );
        }
        
        
    }
    
    /**
     * 上传图片
     * 
     * @param string $content       图片内容
     * @param int $width            图片宽度
     * @param int $height           图片高度
     */
    public static function uploadImg( $content , $width = 0 , $height = 0 )
    {
        //图片助手类
        $imgHelper = Helper_Img::getInstance();

        //获取文件格式
        $imgType = $imgHelper->checkImgType( $content );

        //文件类型错误
        if( !$imgType )
        {
            throw new AppException( 2004 );
        }

        //生成70x70的头像
        $imgHelper->setSrcImg( $content , $imgType );
        $imgHelper->setDstImg();
        
        $width = empty( $width ) ? $imgHelper->src_w : $width;
        $height = empty( $height ) ? $imgHelper->src_h : $height;
        
        $picName = $imgHelper->createImg( $width , $height );

        //释放
        $imgHelper->destroyImg();
        
        return $picName;
    }
      /**
       * 获得所有消费层次
       */
      public function getLevels(){
          $levels = Common::getMysql()->getList( self::TABLE_DIMENSION , array('FId' =>18));
          return $levels;
      }
      /**
       * 获得所用年龄段
       */
      public  function getAge(){
         $age = Common::getMysql()->getList( self::TABLE_DIMENSION , array('FId' =>19));
         return $age;
      }
     /**
      * 获得所有适合性别
      */
      public function getSex(){
          $sex = Common::getMysql()->getList( self::TABLE_DIMENSION , array('FId' =>17) );
          return $sex;
      }
    
      
      /**
       *删除产品表
       * @param type $pid
       * @return type 
       */
      public function delProduct( $pid ){
          $product = Common::getMysql()->delete( self::TABLE_NAME , array( 'PId' => $pid));
          return $product;
          
      }
      
      
}
